﻿using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.IO;
using System.Diagnostics;
using System.Text;
using System.Text.RegularExpressions;

/* 错误
 * 1000 Application_Error
 * 
 * 警告
 * 2000 Application_Start
 * 2001 Application_End
 * 2002 不是整数
 */
namespace hcom
{
	public class hLog
	{
		/*/// <summary>
		/// 写日志文件
		/// </summary>
		/// <param name="code">日志码</param>
		/// <param name="message">日志内容</param>
		public void Write(int code, string message)
		{
			Write( code, message, 2 );
		}
		*/
		/*/// <summary>
		/// 写日志文件
		/// </summary>
		/// <param name="code">日志码</param>
		/// <param name="message">日志内容</param>
		/// <param name="stack">显示栈级别</param>
		public void Write(int code, string message)
		{
			try
			{
                //取当前文件名等信息, ?? 发布版取不到这些信息
				/*StringBuilder str = new StringBuilder(10000);
				StackTrace st = new StackTrace(true);
                StackFrame sf = st.GetFrame(stack);	//取第二个栈，就是写日志语句的方法
				str.AppendFormat("{0}\t{1:yyyy-MM-dd HH:mm:ss}\t{2}\t{3}\t{4}\t{5}\r\n",
					code, DateTime.Now, sf.GetFileLineNumber(), sf.GetFileName(), sf.GetMethod().Name, message);
				

				string str = string.Format("{0}\t{1:yyyy-MM-dd HH:mm:ss}\t{2}\t{3}\r\n",
					code,
					HttpContext.Current != null ? HttpContext.Current.Request.Url.ToString() : "Global.asax",
					message);*
				string str = string.Format("{0}\t{1:yyyy-MM-dd HH:mm:ss}\t{2}\t{3}\r\n",
					code,
					DateTime.Now,
					HttpContext.Current != null ? HttpContext.Current.Request.RawUrl : "Global.asax",
					message);

				string logpath = string.Format( "{0}Loges\\log{1:yyyyMM}.txt",
					System.AppDomain.CurrentDomain.BaseDirectory,		//取网站虚拟目录的实际文件夹
					DateTime.Now);
				File.AppendAllText(logpath, str);
			}
			catch( Exception ex ){
				Console.Write( ex.ToString() );
			}
		}*/

		/// <summary>
		/// 写日志，把错误信息显示到页面，不输出原有页面。把栈的最后一行存到日志文件中。
		/// </summary>
		/// <param name="Response">页面响应信息</param>
		/// <param name="ex">异常信息</param>
		public void Write(string url, Exception ex)
		{
			try
			{
				// 取栈中有关的部分，就是文件路径相同的部分。
				string basepath = System.AppDomain.CurrentDomain.BaseDirectory;		//取网站虚拟目录的实际文件夹，用于判断代码文件名是否与网站有关。
				StringBuilder txt = new StringBuilder(10000);
				txt.AppendFormat("{0:yyyy-MM-dd HH:mm:ss}\t{1}\t{2}<br>",
					DateTime.Now,
					ex.Message,
					url
					);

				foreach (Match match in Regex.Matches(ex.StackTrace, @"(.*" + basepath.Replace("\\", "\\\\") + "[^\r^\n]*)"))
				{
					txt.Append(match.Result("$1。<br>"));	//与网站有关的栈信息。
				}
				txt.Append("<br>");

				// 存入loges，每月一个文件
				string logpath = string.Format( "{0}Loges\\log{1:yyyyMM}.htm",
					basepath,
					DateTime.Now);
				File.AppendAllText(logpath, txt.ToString());
			}
			catch( Exception e ){
				Console.Write( e.ToString() );
			}
		}

	}
}
